home *** CD-ROM | disk | FTP | other *** search
/ Chip: 2005 Utilities / CHIP Utilities 2005.7z / CHIP Utilities 2005.iso / docs / get-ubcd-docs-curr.pl next >
Perl Script  |  2004-11-29  |  16KB  |  537 lines

  1. #!/usr/bin/perl 
  2. # -w
  3.  
  4. use Data::Dumper;
  5. use Tie::IxHash;
  6. use XML::Checker;
  7. use XML::Simple;
  8. use XML::Writer;
  9. use XML::Generator;
  10. use XML::Parser;
  11. use Tie::IxHash;
  12. use XML::LibXML;
  13. use IO::Handle;
  14. use IO;
  15. use XML::SimpleObject;
  16. use XML::TreeBuilder;
  17. use XML::Element;
  18. use Getopt::Std;
  19. #XML::Parser::Grove - went ok
  20. #XML::Grove - failed
  21.  
  22. # should use these
  23. use XML::DOM;
  24. use XML::LibXML;
  25. use XML::LibXSLT;
  26.  
  27. # to do
  28. #
  29. # update freesco
  30. #
  31. # make html print more fields
  32. # tighten code
  33. # perlize for greater cross platform compatability
  34. # add routine to get size of images
  35. # improve descriptions
  36. # fix link building problem that effects 3 links
  37.  
  38. # start in base dir
  39. chdir "/docs_uncompressed";
  40. &check_form;
  41. $fh="/docs/ubcd.xml";
  42. &check_valid;
  43. exit;
  44.  
  45. # input file
  46. open(UBCDDOCS,"<ubcd-docs.csv");
  47. open(UBCDDOCS,"<ubcd.xml");
  48.  
  49. # files to write
  50. open(UBCDINDEX,">ubcd-index.html");
  51. open(UBCDINDEXTABLE,">ubcd-index-table.html");
  52. open(UBCDINDEXTXT,">ubcd-index.csv");
  53. open(UBCDINDEXXML,">ubcd-index.xml");
  54. open(UBCDINDEXXST,">ubcd-index.xsl");
  55. open(UBCDINDEXDTD,">ubcd-index.dtd");
  56.  
  57. # sort input file by utility name
  58. $srt=`sort ubcd-docs.csv > ubcd-docs.csv.sorted`;
  59. $srt=`cp -f ubcd-docs.csv.sorted ubcd-docs.csv`;
  60. $srt=`rm -f ubcd-docs.csv.sorted`;
  61.  
  62. @data_vars=(utility,doc1,doc1title,doc2,doc2title,doc3,doc3title,doc4,doc4title,doc5,doc5title,doc6,doc6title,doc7,doc7title,webpage,imagename,description,dosapp,category,menu,maintainer,lastupdate,version,size);
  63. @data_vars_enc=(url_orig,utility_enc,doc1_enc,doc1title_enc,doc2_enc,doc2title_enc,doc3_enc,doc3title_enc,doc4_enc,doc4title_enc,doc5_enc,doc5title_enc,doc6_enc,doc6title_enc,doc7_enc,doc7title_enc,webpage_enc,imagename_enc,description_enc,dosapp_enc,category_enc,menu_enc,maintainer_enc,lastupdate_enc,version_enc,size_enc);
  64.  
  65. %titles=(utility => "Utility",doc1 => "Doc #1",doc1title => "Doc #1",doc2 => "Doc #1",doc2title => "Doc #1",doc3 => "Doc #1",doc3title => "Doc #1",doc4 => "Doc #1",doc4title => "Doc #1",doc5 => "Doc #1",doc5title => "Doc #1",doc6 => "Doc #1",doc6title => "Doc #1",doc7 => "Doc #1",doc7title => "Doc #1",webpage => "Doc #1",imagename => "Doc #1",dosapp => "Doc #1",category => "Doc #1",menu => "Doc #1",maintainer => "Doc #1",lastupdate => "Doc #1",version => "Doc #1");
  66. @doc_vars=(doc1,doc2,doc3,doc4,doc5,doc6,doc7,webpage);
  67. $webpagetitle="Web Page";
  68.  
  69. &printdtd;
  70. &printxsl;
  71. &printtitles;
  72.  
  73. print "Gathering Docs\n";
  74. foreach $utility_info (<UBCDDOCS>){
  75.     chomp($utility_info);
  76.     ($utility,$doc1,$doc1title,$doc2,$doc2title,$doc3,$doc3title,$doc4,$doc4title,$doc5,$doc5title,$doc6,$doc6title,$doc7,$doc7title,$webpage,$imagename,$description,$dosapp,$category,$menu,$maintainer,$lastupdate,$version,$size)=split /,/,$utility_info;
  77.     $utility =~ s/"//g;$description =~ s/"//g;$imagename =~ s/"//g;$dosapp =~ s/"//g;$category =~ s/"//g;$menu =~ s/"//g;$maintainer =~ s/"//g;$lastupdate =~ s/"//g;$size =~ s/"//g;$version =~ s/"//g;
  78.     chomp($imagename);
  79.     $imagename_fixed=lc $imagename;
  80.     $file_test="$imagename_fixed".".igz";
  81.     print "looking for [$file_test]\n";
  82.     if (-f "/mnt/disk/images/$file_test"){
  83.         $imagename_fixed="$imagename_fixed".".igz";
  84.     }else{
  85.         $imagename_fixed="$imagename_fixed".".img";    
  86.     }
  87.     
  88.     chomp($size=`du -k /mnt/disk/images/$imagename_fixed|cut -f1`);
  89.     if ($imagename !~ m/[a-z|A-Z]/ or $imagename =~ m/Utility/){next;};
  90.  
  91.     print "\n\n\nGetting docs for [$imagename|$dosapp]\n";
  92.     mkdir $imagename;
  93.     chdir "$imagename";
  94.     print UBCDINDEX qq!$utility   $description   !;
  95.     print UBCDINDEXTXT qq!$utility, $description, !;
  96.     print UBCDINDEXTABLE qq!<tr><td>$utility</td><td>$description</td>!;
  97.  
  98.     &printutilinfo;
  99.  
  100.     foreach $doc_var (@doc_vars){    
  101.         if ($$doc_var =~ m/[a-z|A-Z]/){
  102.             # remove quotes
  103.             $$doc_var =~ s/"//g;
  104.             $doc_url = $$doc_var;
  105.             
  106.             # define other doc vars
  107.             $doc_title_var = "$doc_var" . "title";
  108.  
  109.             # remove quotes
  110.             $$doc_title_var =~ s/"//g;
  111.  
  112.             print "Fetching [$$doc_var]\n";
  113.             system(qq!wget --continue --tries=1 --html-extension --convert-links --page-requisites --user-agent="Mozilla/4.0 (compatable; MSIE 6.0; Windows NT 5.1)" "$$doc_var"!);
  114.             if ($$doc_var =~ m/.pdf$|.PDF$/){
  115.                 $url_orig=$$doc_var;
  116.                 # convert PDFs to html
  117.                 $$doc_var =~ s/http:\//$imagename/g;
  118.                 print "PDF CONVERSION";
  119.                 $cvtoutput=`pdftotext -layout -htmlmeta -eol unix -nopgbrk "/docs_uncompressed/$$doc_var" 2>&1`;
  120.                 print " [$cvtoutput:/docs_uncompressed/$$doc_var]\n";
  121.                 unlink "/docs_uncompressed/$$doc_var";
  122.  
  123.                 # change converted PDF extension to html
  124.                 $$doc_var =~ s/.pdf$|.PDF$/.html/;
  125.     
  126.                 # fix document name & location to be loadable via a browser.
  127.                 $tmp_doc_var = $$doc_var;
  128.                 $$doc_var =~ s/\?|=|&|\+//g;
  129.                 if ($$doc_var ne $tmp_doc_var){
  130.                     chdir "/docs_uncompressed";
  131.                     rename ("/docs_uncompressed/$tmp_doc_var","/docs_uncompressed/$$doc_var");
  132.                     print "File moved [/docs_uncompressed/$tmp_doc_var|/docs_uncompressed/$$doc_var][$!]\n";
  133.                     chdir "/docs_uncompressed";
  134.                 }
  135.                 
  136.                 # write indexes
  137.                 &encode_xml_data;
  138.                 print UBCDINDEX qq!<A HREF="$$doc_var">$$doc_title_var [html]</A>   !;
  139.                 print UBCDINDEXTXT qq!$$doc_title_var, $$doc_var, !;
  140.                 print UBCDINDEXTABLE qq!<td><a href="$$doc_var">$$doc_title_var</a></td>!;
  141.                 &printdoc;
  142.             }else{
  143.                 $url_orig=$$doc_var;
  144.                 # change http: to file:
  145.                 $$doc_var =~ s/http:\//$imagename/g;
  146.  
  147.                 # if the document is a html type document as defined by wget ensure it ends in .html
  148.                 if ($$doc_var !~ m/.aspx$|.htm$|.html$|.faq$|.FAQ$|.lsm$|.txt$|.doc$/ and $$doc_var !~ m/\/$/){$$doc_var = $$doc_var . ".html"};
  149.  
  150.                 # fix document name & location to be loadable via a browser.
  151.                 $tmp_doc_var = $$doc_var;
  152.                 $$doc_var =~ s/\?|=|&|\+//g;
  153.                 if ($$doc_var ne $tmp_doc_var){
  154.                     chdir "/docs_uncompressed";
  155.                     rename ("/docs_uncompressed/$tmp_doc_var","/docs_uncompressed/$$doc_var");
  156.                     print "File moved [/docs_uncompressed/$tmp_doc_var|/docs_uncompressed/$$doc_var][$!]\n";
  157.                     chdir "/docs_uncompressed";
  158.                 }
  159.  
  160.                 # write indexes
  161.                 &encode_xml_data;
  162.                 print UBCDINDEX qq!<A HREF="$$doc_var">$$doc_title_var</A>   !;
  163.                 print UBCDINDEXTXT qq!$$doc_title_var, $$doc_var, !;
  164.                 print UBCDINDEXTABLE qq!<td><a href="$$doc_var">$$doc_title_var</a></td>!;
  165.                 &printdoc;
  166.             }
  167.         }
  168.     }
  169.     print UBCDINDEX qq!<BR>\n!;
  170.     print UBCDINDEXTXT qq!\n!;
  171.     print UBCDINDEXTABLE qq!</tr>\n!;
  172.     print UBCDINDEXXML qq!</utility_info>\n\n!;
  173.     chdir "/docs_uncompressed";
  174. }
  175.  
  176. print UBCDINDEX qq!</body></html>\n!;
  177. print UBCDINDEXTXT qq!End\n!;
  178. print UBCDINDEXTABLE qq!</table></body></html>\n!;
  179. print UBCDINDEXXML qq!</catalog>\n!;
  180.  
  181. chomp($check=`du -bs /docs_uncompressed`);
  182. print "\n\nDocs RAW Size [$check]\n\n";
  183.  
  184. print "Running html tidy on html files\n";
  185. system('find . -name *.html -o -name *.htm -print -exec tidy -modify -upper -quiet -omit -errors {} \; > /dev/null 2>&1');
  186. chomp($check=`du -bs /docs_uncompressed`);
  187. print "Docs after HTML Tidy Size [$check]\n\n";
  188.  
  189. print "Compressing docs_uncompressed to /cmp\n";
  190. $rm_old=`rm -rf /cmp /docs`;
  191. $pack_result=`webpack -b /cmp/`;
  192. chomp($check=`du -bs /cmp`);
  193. print "/cmp compressed Size [$check]\n\n";
  194.  
  195. print "Moving /cmp to /docs\n";
  196. $move=`mv -f /cmp /docs`;
  197.  
  198. # Validate XML
  199. &check_form;
  200.  
  201. print "Archiving docs\n";
  202. $tgz=`tar -czf /docs.tar.gz /docs`;
  203. chomp($tgz_size=`du -bs /docs.tar.gz`);
  204. print "Archive size [$tgz_size]\n\n";
  205.  
  206. print "Done\n\n";
  207. close;
  208. exit;
  209.  
  210. sub encode_xml_data{
  211. $utility_enc=$utility;
  212. $doc1_enc=$doc1;
  213. $doc1title_enc=$doc1title;
  214. $doc2_enc=$doc2;
  215. $doc2title_enc=$doc2title;
  216. $doc3_enc=$doc3;
  217. $doc3title_enc=$doc3title;
  218. $doc4_enc=$doc4;
  219. $doc4title_enc=$doc4title;
  220. $doc5_enc=$doc5;
  221. $doc5title_enc=$doc5title;
  222. $doc6_enc=$doc6;
  223. $doc6title_enc=$doc6title;
  224. $doc7_enc=$doc7;
  225. $doc7title_enc=$doc7title;
  226. $webpage_enc=$webpage;
  227. $imagename_enc=$imagename;
  228. $description_enc=$description;
  229. $dosapp_enc=$dosapp;
  230. $category_enc=$category;
  231. $menu_enc=$menu;
  232. $maintainer_enc=$maintainer;
  233. $lastupdate_enc=$lastupdate;
  234. $version_enc=$version;
  235. $size_enc=$size;
  236.  
  237. foreach $data (@data_vars_enc){ 
  238.     $$data =~ s/</</g;
  239.     $$data =~ s/&/&/g;
  240.     $$data =~ s/>/>/g;
  241.     $$data =~ s/"/"/g;
  242.     $$data =~ s/'/'/g;
  243. }
  244. }
  245.  
  246. sub printtitles{
  247. # print document titles
  248. print UBCDINDEX <<EOF;
  249. <html><head><title>UBCD CD Based Docs - HTML</title></head><body>
  250. <BR>UBCD CD based docs index types: <a href="ubcd-index.html">HTML</a>   <a href="ubcd-index-table.html">HTML Table</a>   <a href="ubcd.xml">XML</a>   <a href="ubcd-index.csv">CSV</a><BR><BR>
  251. <html><head><title>UBCD CD Based Docs - HTML</title></head><body>
  252. UTILITY   DESCRIPTION   DOCUMENTS<BR>
  253. EOF
  254.  
  255. print UBCDINDEXTABLE <<EOF;
  256. <html><head><title>UBCD CD Based Docs - HTML Table</title></head><body>
  257. <BR>UBCD CD based docs index types: <a href="ubcd-index.html">HTML</a>    <a href="ubcd-index-table.html">HTML Table</a>    <a href="ubcd.xml">XML</a>    <a href="ubcd-index.csv">CSV</a><BR><BR>
  258. <table border="1">
  259. <TR><TD>UTILITY</TD><TD>DESCRIPTION</TD><TD>DOCUMENTS</TD></TR>
  260. EOF
  261.  
  262. print UBCDINDEXTXT qq!UBCD CD Based Docs - Text Listing - CSV\n!;
  263. print UBCDINDEXTXT qq!UTILITY,DESCRIPTION,DOCUMENT,DOCUMENT,DOCUMENT,DOCUMENT,DOCUMENT,DOCUMENT,DOCUMENT,WEBPAGE,\n!;
  264. print UBCDINDEXXML <<EOF;
  265. <?xml version="1.0"?>
  266. <?xml-stylesheet type="text/xsl" href="ubcd.xsl"?>
  267. <!DOCTYPE catalog SYSTEM "ubcd.dtd">
  268. <catalog>
  269. EOF
  270. }
  271.  
  272. sub printutilinfo{
  273. &encode_xml_data;
  274. print UBCDINDEXXML <<EOF;
  275. <utility_info>
  276.     <utility>$utility_enc</utility>
  277.     <description>$description_enc</description>
  278.     <imagename>$imagename_enc</imagename>
  279.     <dosapp>$dosapp_enc</dosapp>
  280.     <category>$category_enc</category>
  281.     <menu>$menu_enc</menu>
  282.     <maintainer>$maintainer_enc</maintainer>
  283.     <lastupdate>$lastupdate_enc</lastupdate>
  284.     <size>$size_enc</size>
  285.     <version>$version_enc</version>
  286. EOF
  287. }
  288.  
  289. sub printdoc{
  290.     $$doc_title_var =~ s/</</g;
  291.     $$doc_title_var =~ s/&/&/g;
  292.     $$doc_title_var =~ s/>/>/g;
  293.     $$doc_title_var =~ s/"/"/g;
  294.     $$doc_title_var =~ s/'/'/g;
  295.  
  296.     $$doc_var =~ s/</</g;
  297.     $$doc_var =~ s/&/&/g;
  298.     $$doc_var =~ s/>/>/g;
  299.     $$doc_var =~ s/"/"/g;
  300.     $$doc_var =~ s/'/'/g;
  301.  
  302.     $$doc_url =~ s/</</g;
  303.     $$doc_url =~ s/&/&/g;
  304.     $$doc_url =~ s/>/>/g;
  305.     $$doc_url =~ s/"/"/g;
  306.     $$doc_url =~ s/'/'/g;
  307.  
  308. print UBCDINDEXXML <<EOF;
  309.     <doc>
  310.         <title>$$doc_title_var</title>
  311.         <location>$$doc_var</location>
  312.         <url>$url_orig</url>
  313.     </doc>
  314. EOF
  315. }
  316.  
  317. sub printdtd{
  318. # ubcd.dtd
  319. print UBCDINDEXDTD <<EOF;
  320. <!ELEMENT catalog (utility_info*)>
  321. <!ELEMENT utility_info (utility, description, imagename, dosapp?, category, menu, maintainer, lastupdate, size?, version, doc*)>
  322. <!ELEMENT utility (#PCDATA)>
  323. <!ELEMENT description (#PCDATA)>
  324. <!ELEMENT imagename (#PCDATA)>
  325. <!ELEMENT dosapp (#PCDATA)>
  326. <!ELEMENT category (#PCDATA)>
  327. <!ELEMENT menu (#PCDATA)>
  328. <!ELEMENT maintainer (#PCDATA)>
  329. <!ELEMENT lastupdate (#PCDATA)>
  330. <!ELEMENT size (#PCDATA)>
  331. <!ELEMENT version (#PCDATA)>
  332. <!ELEMENT doc (title, location, url)>
  333. <!ELEMENT title (#PCDATA)>
  334. <!ELEMENT location (#PCDATA)>
  335. <!ELEMENT url (#PCDATA)>
  336. EOF
  337. # end ubcd.dtd
  338. }
  339.  
  340. sub printxsl{
  341. # ubcd.xsl
  342. print UBCDINDEXXST <<EOF;
  343. <?xml version="1.0"?>
  344. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  345. <xsl:output method="html" encoding="UTF-8"/>
  346.  
  347. <xsl:template match="/">
  348. <html><head><title>UBCD CD Based Docs - XML</title></head>
  349. <body>
  350. <p><b>UBCD CD based documentation</b></p>
  351. <ol>
  352. <xsl:apply-templates mode="TOC"/>
  353. </ol>
  354. <xsl:apply-templates mode="body"/>
  355. </body>
  356. </html>
  357. </xsl:template>
  358.  
  359. <xsl:template match="utility_info" mode="TOC">
  360. <li><a href="{concat('#utility', position())}"><xsl:value-of
  361. select="utility/text()"/></a></li>
  362. </xsl:template>
  363.  
  364. <xsl:template match="utility_info" mode="body">
  365. <p><a name="{concat('utility', position())}"><xsl:value-of
  366. select="text()"/></a></p>
  367. <xsl:apply-templates select="utility"/>
  368. <xsl:text> </xsl:text>
  369. <xsl:apply-templates select="version"/>
  370. <br></br>
  371. <xsl:apply-templates select="description"/>
  372. <br></br>
  373. <xsl:apply-templates select="lastupdate"/>
  374. <xsl:apply-templates select="doc"/>
  375. </xsl:template>
  376.  
  377. <xsl:template match="utility"><b><xsl:value-of
  378. select="text()"/></b></xsl:template>
  379.  
  380. <xsl:template match="description"><xsl:value-of select="text()"/></xsl:template>
  381.  
  382. <!-- this is a way to handle docs. please uncomment this and comment
  383. the doc template under it
  384. <xsl:template match="doc">
  385. <br></br><a href="{url}"><xsl:value-of select="title"/></a>
  386. </xsl:template>
  387. -->
  388.  
  389. <xsl:template match="doc">
  390. <br></br>
  391. <xsl:text>[documentation] </xsl:text>
  392. <xsl:value-of select="title"/>
  393. <xsl:text>: </xsl:text>
  394. <a href="{url}">web</a>
  395. <xsl:text> </xsl:text>
  396. <a href="{location}">local</a>
  397. </xsl:template>
  398.  
  399.  
  400. <xsl:template match="version">Version: <xsl:value-of
  401. select="text()"/></xsl:template>
  402. <xsl:template match="lastupdate">Last Updated: <xsl:value-of
  403. select="text()"/></xsl:template>
  404.  
  405. </xsl:stylesheet>
  406. EOF
  407. # end ubcd.xsl
  408. }
  409.  
  410. sub check_form{
  411.    my $xmlfile = "/docs/ubcd.xml";              # the file to parse
  412.    
  413.    # initialize parser object and parse the string
  414.    my $parser = XML::Parser->new( ErrorContext => 2 );
  415.    eval { $parser->parsefile( $xmlfile ); };
  416.  
  417.    # report any error that stopped parsing, or announce success
  418.    if( $@ ) {
  419.        $@ =~ s/at \/.*?$//s;               # remove module line number
  420.        print STDERR "Validating XML (Form)  [ERROR in '$xmlfile']:\n$@\n";
  421.    } else {
  422.        print STDERR "Validating XML (Form)  ['$xmlfile' is well-formed]\n";
  423.    }
  424. }
  425.  
  426. sub dump_tree{
  427.    # initialize parser and read the file
  428.    $parser = new XML::Parser( Style => 'Tree' );
  429.    my $tree = $parser->parsefile( shift @ARGV );
  430.    
  431.    # serialize the structure
  432.    print Dumper( $tree );
  433. }
  434.  
  435. sub check_valid{
  436.    print "Validating XML (Valid) ['$fh' is ";
  437.    # initialize the parser
  438.    my $parser = new XML::LibXML;
  439.  
  440.    # open a filehandle and parse
  441.    my $fh = new IO::Handle;
  442.    if( $fh->fdopen( fileno( STDIN ), "r" )) {
  443.        my $doc = $parser->parse_fh( $fh );
  444.        if( $doc and $doc->is_valid ) {
  445.            print "valid]\n";
  446.        } else {
  447.            print "invalid]\n";
  448.        }
  449.        $fh->close;
  450.    }
  451. }
  452.  
  453. # ---- test code ---- #
  454.  
  455. # handle xml declaration
  456. #
  457. sub xml_decl {
  458.     my( $self, $properties ) = @_;
  459.     output( "<?xml version=\"" . $properties->{'Version'} . "\"" );
  460.     my $encoding = $properties->{'Encoding'};
  461.     output( " encoding=\"$encoding\"" ) if( $encoding );
  462.     my $standalone = $properties->{'Standalone'};
  463.     output( " standalone=\"$standalone\"" ) if( $standalone );
  464.     output( "?>\n" );
  465. }
  466.  
  467. #
  468. # handle doctype declaration:
  469. # try to duplicate the original
  470. #
  471. sub doctype_decl {
  472.     my( $self, $properties ) = @_;
  473.     output( "\n<!DOCTYPE " . $properties->{'Name'} . "\n" );
  474.     my $pubid = $properties->{'PublicId'};
  475.     if( $pubid ) {
  476.         output( "  PUBLIC \"$pubid\"\n" );
  477.         output( "  \"" . $properties->{'SystemId'} . "\"\n" );
  478.     } else {
  479.         output( "  SYSTEM \"" . $properties->{'SystemId'} . "\"\n" );
  480.     }
  481.     my $intset = $properties->{'Internal'};
  482.     if( $intset ) {
  483.         $in_intset = 1;
  484.         output( "[\n" );
  485.     } else {
  486.         output( ">\n" );
  487.     }
  488. }
  489.  
  490. #
  491. # handle entity declaration in internal subset:
  492. # recreate the original declaration as it was
  493. #
  494. sub entity_decl {
  495.     my( $self, $properties ) = @_;
  496.     my $name = $properties->{'Name'};
  497.     output( "<!ENTITY $name " );
  498.     my $pubid = $properties->{'PublicId'};
  499.     my $sysid = $properties->{'SystemId'};
  500.     if( $pubid ) {
  501.         output( "PUBLIC \"$pubid\" \"$sysid\"" );
  502.     } elsif( $sysid ) {
  503.         output( "SYSTEM \"$sysid\"" );
  504.     } else {
  505.         output( "\"" . $properties->{'Value'} . "\"" );
  506.     }
  507.     output( ">\n" );
  508. }
  509.  
  510. # ---- next segment ---- #
  511.  
  512.  
  513. sub test_gen_xml{
  514. my $output = new IO::File(">output.xml");
  515.  
  516. my $writer = new XML::Writer( OUTPUT => $output );
  517.  
  518. $writer->xmlDecl( 'UTF-8' );
  519. $writer->doctype( 'html' );
  520. $writer->comment( 'My happy little HTML page' );
  521. $writer->pi( 'foo', 'bar' );
  522. $writer->startTag( 'html' );
  523. $writer->startTag( 'body' );
  524. $writer->startTag( 'h1' );
  525. $writer->startTag( 'font', 'color' => 'green' );
  526. $writer->characters( "<Hello World!>" );
  527. $writer->endTag( );
  528. $writer->endTag( );
  529. $writer->dataElement( "p", "Nice to see you." );
  530. $writer->endTag( );
  531. $writer->endTag( );
  532. $writer->end( );
  533.  
  534.  
  535. }
  536.  
  537.